DWORD FindPattern(char *pattern, int len, DWORD dwStart, DWORD dwLen) 
{ 
    char *m = (char *)dwStart; 
    for(; (DWORD)m < (dwStart + dwLen); m++) 
	if(!memcmp(m, pattern, len)) 
    return (DWORD)m; 
	return NULL; 
}
void OnlyHook(LARGE_INTEGER *lp, bool force = true)
{
	static bool NotPatched = true; 
	if (NotPatched) 
	{
		char engine_sig[] = "\x89\x74\x24\x5C\x89\x74\x24\x60\x89\x74\x24\x64\x89\x74\x24\x68\x89\x74\x24\x6C\x89\x74\x24\x70\x89\x74\x24\x74\x89\x74\x24\x78\x89\x74\x24\x7C\0"; 
		DWORD dwEngine = FindPattern(engine_sig, strlen(engine_sig), 0x01D60000, 0x01000000); 
		DWORD Slots_sig = (*(DWORD*)(dwEngine - 0x74));
		slots = (DWORD*)Slots_sig;

		int a;
		for(a=0x01D00000;a<0x01D0FFFF;a++)
		{
			if(*(PBYTE)(a) == 0x68 && *(PBYTE)(a + 0x05) == 0xE8 &&
			*(PBYTE)(a + 0x0A) == 0x6A && *(PBYTE)(a + 0x0B) == 0x07 &&
			*(PBYTE)(a + 0x0C) == 0x68 && *(PBYTE)(a + 0x11) == 0xFF &&
			*(PBYTE)(a + 0x12) == 0x15 && *(PBYTE)(a + 0x17) == 0x68)
			{
				pEngfuncs = (cl_enginefunc_t*)*(DWORD*)(a+0x0D);
			}
		} 
		int b;
		for(b=0x01D00000;b<0x01D0FFFF;b++)
		{
			if(*(PBYTE)(b) == 0xE8 && *(PBYTE)(b + 0x05) == 0x6A &&
			*(PBYTE)(b + 0x06) == 0x07 && *(PBYTE)(b + 0x07) == 0x68 &&
			*(PBYTE)(b + 0x0C) == 0xFF && *(PBYTE)(b + 0x0D) == 0x15 &&
			*(PBYTE)(b + 0x12) == 0x68 && *(PBYTE)(b + 0x1C) == 0x81)
			{
				ppmove = (playermove_s*)*(DWORD*)(b+0x13);
			}
		}
		int c;
		for(c=0x01D00000;c<0x01D0FFFF;c++)
		{ 
			if(*(PBYTE)(c) == 0x68 && *(PBYTE)(c + 0x05) == 0x68 &&
			*(PBYTE)(c + 0x0A) == 0x6A && *(PBYTE)(c + 0x0B) == 0x01 &&
			*(PBYTE)(c + 0x0C) == 0xFF && *(PBYTE)(c + 0x0D) == 0xD0 &&
			*(PBYTE)(c + 0x0E) == 0x83 && *(PBYTE)(c + 0x27) == 0xC3)
			{
				pstudio = (engine_studio_api_s*)*(DWORD*)(c+0x01);
				ppinterface = (r_studio_interface_s**)*(DWORD*)(c+0x06);
			}
		}
		NotPatched = false; 
	}
	
struct cl_enginefuncs_s gEngfuncs; 
struct cl_enginefuncs_s gHookedEngfuncs; 
struct efx_api_s gHookEfxApi; 
engine_studio_api_t IEngineStudio; 
engine_studio_api_t* pIEngineStudio=0; 
cl_enginefuncs_s* pEngfuncs; 
engine_studio_api_s* pstudio; 
playermove_s *ppmove; 
r_studio_interface_s** ppinterface;
DWORD* slots;